package com.offcn.service.Impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.offcn.mapper.MemberMapper;
import com.offcn.mapper.OrderMapper;
import com.offcn.mapper.OrdersettingMapper;
import com.offcn.mapper.SetmealMapper;
import com.offcn.pojo.Member;
import com.offcn.pojo.Order;
import com.offcn.pojo.Ordersetting;
import com.offcn.pojo.Setmeal;
import com.offcn.service.OrderService;
import com.offcn.utils.MessageConstant;
import com.offcn.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: wy
 * @Date: 2022/9/2 10:52
 */
@Service
@Component
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private OrdersettingMapper ordersettingMapper;

    @Autowired
    private MemberMapper memberMapper;

    @Autowired
    private SetmealMapper setmealMapper;


    @Override
    public Result submitOrder(Map map) {

        Order newOrder = new Order();
        /*
        1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行 预约
        2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
        3、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约 则无法完成再次预约
        4、检查当前用户是否为会员，如果是会员  则直接完成预约，如果不是会员则自动完成注 册并进行预约

        5、预约成功，更新当日的已预约人数

        所选的 map 集合中有
        name
        sex
        telephone
        idCard
        orderDate
        setmealId
         */

        // 1、检查用户所选择的预约日期是否已经提前进行了预约设置，如果没有设置则无法进行 预约
        /*
        Ordersetting 先通过 日期 去判断 这一天是不是  可以设置 预约功能
         */
        LambdaQueryWrapper<Ordersetting> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Ordersetting::getOrderdate, map.get("orderDate"));
        Ordersetting ordersetting = ordersettingMapper.selectOne(lambdaQueryWrapper);
        System.out.println(ordersetting);
        if (ordersetting == null) {
            //表示 这一天 不对外 开放预约设置 直接返回信息
            return new Result(false,
                    MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }
        //2、检查用户所选择的预约日期是否已经约满，如果已经约满则无法预约
        if (ordersetting.getReservations() >= ordersetting.getNumber()) {
            //之间返回 信息 今天已经预约满了 不能进行预约
            return new Result(false, MessageConstant.ORDER_FULL);
        }


        //3、检查用户是否重复预约（同一个用户在同一天预约了同一个套餐），如果是重复预约 则无法完成再次预约
        /*
        3.1 根据手机号 进行 查询 用户是不是 在 Member 表中 已经存在了
              要是不存在 则 直接注册 会员 并且 可以直接预约
              要是存在 我们需要去判断 这个用户 有没有预约套餐
         */
        LambdaQueryWrapper<Member> memberLambdaQueryWrapper = new LambdaQueryWrapper<>();
        memberLambdaQueryWrapper.eq(Member::getPhonenumber, map.get("telephone"));
        Member member = memberMapper.selectOne(memberLambdaQueryWrapper);

        /*
        3。2 会员存在
         */
        if (member != null) {
            //则证明 这个会员已经存在
            //判断该会员预约的日期中是否已经预约了当前套餐
            LambdaQueryWrapper<Order> orderLambdaQueryWrapper = new LambdaQueryWrapper<>();

            //在判断中 我们需要 判断  会员 id —— 对应的 预约日期 并且 也需要 判断 套餐 对应的 ID 是否存在
            orderLambdaQueryWrapper.
                    eq(Order::getOrderdate, map.get("orderDate")).
                    eq(Order::getSetmealId, map.get("setmealId")).
                    eq(Order::getMemberId, member.getId());
            Order order = orderMapper.selectOne(orderLambdaQueryWrapper);

            if (order != null) {
                //证明这个会员 已经预约过了 不能进行预约 返回信息
                return new Result(false, MessageConstant.HAS_ORDERED);
            } else {
                //可以进行预约  —— 我们需要 吧预约的 信息 封装到一个 新的 neworder 对象中

                //先吧当前 会员对象 存放到 neworder对象中
                newOrder.setMemberId(member.getId());
            }
        }

        /*
             3。3 会员不存在  吧信息 存入到会员表中
         */
        if (member == null) {
            Member member1 = new Member();
            member1.setName((String) map.get("name"));
            member1.setIdcard((String) map.get("idCard"));
            member1.setPhonenumber((String) map.get("telephone"));
            member1.setSex((String) map.get("sex"));
            member1.setRegtime(LocalDate.now());
            memberMapper.insert(member1);

            //吧当前信息会员  存放到  neworder对象中
            newOrder.setMemberId(member1.getId());
        }

        //4.设置预约的该套餐预约数+1
        ordersetting.setReservations(ordersetting.getReservations() + 1);
        ordersettingMapper.updateById(ordersetting);
        //5： 开始预约
        newOrder.setSetmealId(Integer.parseInt((String) map.get("setmealId")));

        DateTimeFormatter dateTimeFormatter =
                DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDate localDate =
                LocalDate.parse((String) map.get("orderDate"), dateTimeFormatter);
        newOrder.setOrderdate(localDate);
        orderMapper.insert(newOrder);//添加订单信息

        //我们并且 也把订单传到页面 以供 将来 在 预约成功之后 我们进行查询 需要 id
        return new Result(true,
                MessageConstant.ORDER_SUCCESS, newOrder.getId());

    }


    //根据订单id 查询订单的方法
    @Override
    public Map<String, Object> findOrderById(Integer id) {

        HashMap<String, Object> hashMap = new HashMap<>();
        //根据id 查询订单该订单
        Order order = orderMapper.selectById(id);
        //根据 该订单的ID 查询该订单 对应的 预约人 会员

        Member member = memberMapper.selectById(order.getMemberId());
        hashMap.put("member", member.getName());
        //根据 该订单的ID 查询该订单 对应的套餐

        Setmeal setmeal = setmealMapper.selectById(order.getSetmealId());
        hashMap.put("setmeal", setmeal.getName());
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        hashMap.put("orderDate", order.getOrderdate().format(fmt));//LocalDate转字符串
        hashMap.put("orderType", order.getOrdertype());
        return hashMap;
    }


}
